package com.treeroot.queue;

public class ArrayQueue {
    /**
     * 最大容量
     */
    private int maxSize;
    /**
     * 队列头的数据的前一个数据
     */
    private int front;
    /**
     * 队列尾
     */
    private int rear;
    /**
     * 该数组用于存放数据，模拟队列
     */
    private int[] arr;

    //创建队列的构造器
    public ArrayQueue(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        //指向队列头部,指出front是指向队列头的数据的前一个数据
        front = -1;
        //指向队列尾部,指向队列尾的数据（即就是队列的最后一个数据）
        rear = -1;

    }

    //判断队列数据是不是满的
    public boolean queueNowIsFull() {
        return rear == maxSize - 1;
    }

    //判断队列数据是否为空
    public boolean queueNowIsEmpty() {
        return rear == front;
    }

    //添加数据到队列
    public void addQueueData(int data) {
        //判断队列是不是满的
        if (queueNowIsFull()) {
            System.out.println("队列满了异常");
            throw new RuntimeException("队列满了异常");
        } else {
            //1.后移rear
            rear++;
            //2.添加数据
            arr[rear] = data;
        }
    }

    //获取（出队列）队列数据
    public int getQueueDate() {
        //判断队列是否空
        if (queueNowIsEmpty()) {
            System.out.println("队列空异常");
            throw new RuntimeException("队列为空，无法取出数据");

        } else {
            //1.后移front
            front++;
            return arr[front];
        }
    }

    //显示所有数据
    public void showQueueData() {
        if (queueNowIsEmpty()) {
            System.out.println("队列空~没有数据");
        }else{
            for (int i = 0; i < arr.length; i++) {
                System.out.printf("arr[%d]=%d\n", i, arr[i]);
            }
        }

    }

    //显示队列头部数据
    public void showHeadData() {
        if (queueNowIsEmpty()) {
            System.out.println("队列空异常");
            throw new RuntimeException("队列为空，无法取出数据");
        }
        System.out.printf("%d\n", front + 1);
    }

}
